package main

import (
	"fmt"
	"unsafe"
)

func main() {
	//声明并初始化一个数组
	arr := [3]int{1, 2, 3}
	fmt.Println(arr)

	//for range 遍历数组
	for key, val := range arr {
		fmt.Print(key, "==>", val, ",") //0==>1,1==>2,2==>3,
	}
	fmt.Println()

	fmt.Println(arr[2]) //打印第三个数值:3
	//fmt.Println(arr[-1]) //错误：下标值不能为负数:invalid array index -1 (index must be non-negative)
	//fmt.Println(arr[4]) //错误：下标值超出了arr的长度范围:invalid array index 8 (out of bounds for 6-element array)
	fmt.Printf("长度：%d, 容量：%d \n", len(arr), cap(arr))

	//因为数组定长，长度和容量相同
	arr[0] = 100
	fmt.Println(arr[0])

	//使用 len() 函数可以获取数组的长度，使用 unsafe.Sizeof() 函数可以获取数组的总大小
	//数组大小就是所有元素的大小之和，这里数组元素的类型为 int。在 64 位平台上，int 类型的大小为 8，数组 arr 一共有 6 个元素，因此它的总大小为 6x8=48 个字节。
	var arr2 = [6]int{1, 2, 3, 4, 5, 6}
	fmt.Println("数组长度：", len(arr2))           // 6
	fmt.Println("数组大小：", unsafe.Sizeof(arr2)) // 48

	//如果不显式初始化，那么数组中的元素值就是它类型的零值。比如下面的数组类型变量 arr1 的各个元素值都为 0
	var arr1 [6]int
	fmt.Println(arr1) // [0 0 0 0 0 0]

	//字符串数组
	var e = [5]string{"name", "age", "sex"}
	fmt.Println(e)

	f := [...]int{1, 2, 3, 4, 5}
	fmt.Println(f)

	g := [...]int{1: 3, 6: 5}
	fmt.Println(g)      //[0 3 0 0 0 0 5]
	fmt.Println(len(g)) // 7

	//数组分割
	arr3 := [...]int{1, 2, 3, 4, 5}
	arr3Sec := arr3[:3]
	fmt.Println(arr3Sec) //[1 2 3]

	//冒泡排序
	array := [5]int{15, 23, 8, 10, 7}
	for i := 1; i < len(array); i++ {
		for j := 0; j < len(array)-i; j++ {
			if array[j] > array[j+1] {
				array[j], array[j+1] = array[j+1], array[j]
			}
		}
	}
	fmt.Println(array) //[7 8 10 15 23]

	//二维数组
	a := [3][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}
	fmt.Println(a)
	fmt.Printf("二维数组的地址：%p,长度：%d \n", &a, len(a))
}
